/**
 * 
 */
package com.dalonedrow.engine.systems.base;

import com.badlogic.gdx.graphics.Texture;
import com.dalonedrow.engine.sprite.base.SimpleColor;
import com.dalonedrow.engine.ui.base.border.GuiBorder;

/**
 * @author Donald
 */
public abstract class ProjectConstants<IO> {
	/**
	 * Sets the chosen pc.
	 * @param refid the reference id of the chosen pc
	 */
	public abstract void setPc(int refid);
	/**
	 * Gets the PC's interactive object instance.
	 * @return {@link IO}
	 */
	public abstract IO getPCObject();
	/** the one and only instance of the <code>ProjectConstants</code> class. */
	private static ProjectConstants	instance;
	/**
	 * Gives access to the singleton instance of {@link ProjectConstants}.
	 * @return {@link ProjectConstants}
	 */
	public static ProjectConstants getInstance() {
		return ProjectConstants.instance;
	}
	/**
	 * Gets the PC's reference id.
	 * @return <code>int</code>
	 */
	public abstract int getPcId();
	/**
	 * Determines if it is the player's turn. 
	 * @return true if it is the player's turn; false otherwise
	 */
	public abstract boolean isPlayersTurn();
	/**
	 * Creates a new instance of {@link ProjectConstants}.
	 */
	protected ProjectConstants() {}
	/** Assigns all views to the interface. */
	public abstract void assignViews();
	/**
	 * Gets the default font color.
	 * @return {@link SimpleColor}
	 */
	public abstract SimpleColor getDefaultFontColor();
	/**
	 * Gets the default H1 font for the project.
	 * @return {@link String}
	 */
	public abstract String getFontH1();
	/**
	 * Gets the default H2 font for the project.
	 * @return {@link String}
	 */
	public abstract String getFontH2();
	/**
	 * Gets the default "normal" font for the project.
	 * @return {@link String}
	 */
	public abstract String getFontNormal();
	/**
	 * Gets the default Title font for the project.
	 * @return {@link String}
	 */
	public abstract String getFontTitle();
	/**
	 * Gets the inactive component font color.
	 * @return {@link SimpleColor}
	 */
	public abstract SimpleColor getInactiveFontColor();
	/**
	 * Gets the path to the game's map files.
	 * @return {@link String}
	 */
	public abstract String getMapFilePath();
	/**
	 * Gets the number of fonts loaded during gameplay.
	 * @return <code>int</code>
	 */
	public abstract int getNumGameFonts();
	/**
	 * Gets the name of the image used for the scrollbar down arrow.
	 * @return {@link String}
	 */
	public abstract String getScrollBarDownArrowImage();
	/**
	 * Gets the name of the image used for the scrollbar up arrow.
	 * @return {@link String}
	 */
	public abstract String getScrollBarUpArrowImage();
	/**
	 * Gets the border class used for the tooltip.
	 * @return {@link String}
	 */
	public abstract String getTooltipBorderClass();
	public abstract GuiBorder getTooltipBorder() throws Exception;
	/**
	 * Gets the tooltip font color.
	 * @return {@link SimpleColor}
	 */
	public abstract SimpleColor getTooltipFontColor();
	/**
	 * Gets the border images used for the project's VX-style dialog.
	 * @return {@link String}[]
	 */
	public abstract String[] getVXStyleDialogBorderImages();
	/**
	 * Gets the top gradient color for the project's VX-style dialog background.
	 * @return <code>float</code>[]
	 */
	public abstract float[] getVXStyleDialogGradientBottom();
	/**
	 * Gets the top gradient color for the project's VX-style dialog background.
	 * @return <code>float</code>[]
	 */
	public abstract float[] getVXStyleDialogGradientTop();
	/**
	 * Gets the border insets for the project's VX-style dialog.
	 * @return <code>int</code>[]
	 */
	public abstract int[] getVXStyleDialogInsets();
	/**
	 * Gets the x-offset for the project's VX-style dialog background.
	 * @return <code>int</code>
	 */
	public abstract int getVXStyleDialogXOffset();
	/**
	 * Gets the y-offset for the project's VX-style dialog background.
	 * @return <code>int</code>
	 */
	public abstract int getVXStyleDialogYOffset();
	/**
	 * Gets the border images used for the project's VX-style speech window.
	 * @return {@link String}[]
	 */
	public abstract String[] getVXStyleSpeechBorderImages();
	/**
	 * Gets the bottom gradient color for the project's VX-style speech window
	 * background.
	 * @return <code>float</code>[]
	 */
	public abstract float[] getVXStyleSpeechGradientBottom();
	/**
	 * Gets the top gradient color for the project's VX-style speech window
	 * background.
	 * @return <code>float</code>[]
	 */
	public abstract float[] getVXStyleSpeechGradientTop();
	/**
	 * Gets the border insets for the project's VX-style speech window.
	 * @return <code>int</code>[]
	 */
	public abstract int[] getVXStyleSpeechInsets();
	/**
	 * Gets the x-offset for the project's VX-style speech window background.
	 * @return <code>int</code>
	 */
	public abstract int getVXStyleSpeechXOffset();
	/**
	 * Gets the y-offset for the project's VX-style speech window background.
	 * @return <code>int</code>
	 */
	public abstract int getVXStyleSpeechYOffset();
	/** Initializes the game animations. */
	public abstract void initAnimations();
	/** Initializes game cursors. */
	public abstract void initCursors();
	/** Initializes the game data. */
	public abstract void initGameData();
	/**
	 * Initializes game maps.
	 * @throws Exception if an error occurs
	 */
	public abstract void initGameMaps() throws Exception;
	/** Initializes the frame. */
	protected abstract void initialize();
	/** Initializes the texture library. */
	public abstract void initTextureLibrary();
	/**
	 * Sets the cursor type displayed.
	 * @param c the cursor to set
	 */
	public abstract void setCursor(int c);
	/**
	 * Sets the global instance.
	 * @param value the instance
	 */
	protected final void setInstance(final ProjectConstants<IO> value) {
		ProjectConstants.instance = value;
	}
	/** Switches the cursor used. */
	public abstract void switchCursor();
	/** Switches the game screen. */
	public abstract void switchScreen() throws Exception;
	/** Updates the game. */
	public abstract void update();
}
